﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace MyAttribute.ModelValidate
{
    public class ValidateManger
    {
        public static List<(bool, string)> Validate<T>(T t)
        {
            List<(bool, string)> validatelist = new List<(bool, string)>();
            Type type1 = typeof(T);
            foreach (var prop in type1.GetProperties())
            {
                //这两段判断，其他操作差不多一样，维度就类型不一样；
                //如何优化？？ 
                //如果我希望支持不同的类型的需求；
                //1.泛型 (不合适的。。。）
                //2.抽象化~~ 得有父类；没有共同的父类、造一个

                #region 常规方法
                ////if (prop.IsDefined(typeof(CustomLengthAttribute), true))
                //    if (prop.IsDefined(typeof(AbstractValidateAttribute), true))
                //    {
                //    object oValue = prop.GetValue(t);
                //    AbstractValidateAttribute attribute = prop.GetCustomAttribute<AbstractValidateAttribute>();

                //    bool bReulst = attribute.Validate(oValue);
                //    if (bReulst==false)
                //    { 
                //        return false;
                //    } 
                //} 
                #endregion

                if (prop.IsDefined(typeof(AbstractValidateAttribute), true))
                {
                    object oValue = prop.GetValue(t);
                    var attributelist = prop.GetCustomAttributes<AbstractValidateAttribute>();
                    foreach (var attribute in attributelist)
                    {
                        bool bReulst1 = attribute.Validate(oValue);
                        if (bReulst1 == false)
                        {
                            validatelist.Add((false, attribute.ErrorMessage));
                        }
                    }


                }
            }
            return validatelist;
        }
    }
}
